// 从上往下是分了三层
#include "NetCal.hpp"    //负责业务处理
#include "Protocol.hpp"  //负责协议处理：分析协议、分析报文、读到完整请求，完成序列化（反）
#include "TcpServer.hpp" //负责进行网络连接、获取
#include "Daemon.hpp"    //实现守护进程的方法
#include <memory>

void Usage(std::string proc)
{
    std::cerr << "Usage: " << proc << "port" << std::endl;
}

// ./tcpserver port
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        Usage(argv[0]);
        exit(USAGE_ERR);
    }
    // 守护进程化
    std::cout << "服务器已经启动，已经是一个守护进程了" << std::endl;
    // Daemon(0, 0);
    daemon(0, 0);

    // 对我们的日志选择往显示器上输出的刷新策略
    // 由于我们上面守护进程化了
    // 导致我们日志往显示器上打印的内容都重定向到了这个/dev/null文件中被丢弃了
    // Enable_Console_Log_Strategy();
    Enable_File_Log_Strategy();

    // 1.顶层，业务逻辑层
    std::unique_ptr<Cal> cal = std::make_unique<Cal>();

    // 2.协议层
    // 构建一个协议对象
    std::unique_ptr<Protocol> protocol = std::make_unique<Protocol>(
        [&cal](Request &req) -> Response
        {
            // 调用Execute方法进行业务处理，也就是计算逻辑
            return cal->Execute(req);
        });

    // 3.服务器层
    std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>(
        std::stoi(argv[1]),
        [&protocol](shared_ptr<Socket> &sock, InetAddr &client)
        {
            // 这样直接从网络过渡到协议该如何读取的问题了
            protocol->GetRequest(sock, client);
        });
    tsvr->Start();

    return 0;
}